package query

import (
	"context"

	"github.com/glennliao/apijson-go/config"
	"github.com/glennliao/apijson-go/consts"
	"github.com/glennliao/apijson-go/model"
	"github.com/samber/lo"
)

type C查询执行器接口 interface {
	J解析条件(conditions model.MapStrAny, accessVerify bool) error
	J解析控制(ctrl model.Map) error
	C查询列表(page int, count int) (list []model.Map, err error)
	C查询总数() (total int64, err error)
	C查询单条() (model.Map, error)
	S设置空结果()
}

type C查询执行器构建器 func(上下文 context.Context, 配置 *config.Z执行器配置) (C查询执行器接口, error)

var C查询执行器构建器映射 = map[string]C查询执行器构建器{}

func Z注册执行器(名称 string, 构建器 C查询执行器构建器) {
	C查询执行器构建器映射[名称] = 构建器
}

func X新建执行器(名称 string, 上下文 context.Context, 配置 *config.Z执行器配置) (C查询执行器接口, error) {
	if 名称 == "" {
		名称 = "default"
	}

	if 构建器, 存在 := C查询执行器构建器映射[名称]; 存在 {
		return 构建器(上下文, 配置)
	}

	return nil, consts.X新建系统错误("query executor not found: " + 名称)
}

func C查询执行器列表() []string {
	return lo.Keys(C查询执行器构建器映射)
}
